The 4th Dimension in Animal Movement

Empirical Study: Movement Models

Authors

Johannes Signer

Cédric Scherer

Stephanie Kramer-Schadt

Published

May 6, 2025

Preparation

## packages
library(readr)
library(dplyr)
library(tidyr)
library(forcats)
library(purrr)
library(raster)
library(lubridate)
library(move)
library(amt)
library(broom)
library(here)
library(glue)
library(ctmm)
library(parallel)

## path to empirical data
dir_emp <- here("output", "empirical", "data_proc")

## path + folder for results
dir_res <- here("output", "empirical", "results")
if (!dir.exists(dir_res)) dir.create(dir_res, recursive = TRUE)

Import Data

## Read landscapes (RasterStack)
env_vars <- terra::rast(paste0(dir_emp, "/env_vars_100m.tif"))

## Read locations for all wild boars and different resolutions
dat <-
  read_rds(paste0(dir_emp, "/boars_resampled_3035.rds")) |>
  dplyr::select(id, res, x, y, t = time) |>
  group_by(id) |>
  ungroup() |>
  nest(data = c(x, y, t))

# RSF
if (!file.exists(paste0(dir_res, "/emp_rsf_est.rds"))) {
  dat_rsf <- dat |> mutate(fits = map(data, ~ {
    x <- .x |> 
      make_track(x, y, t) |> 
      random_points(n = nrow(.x) * 20) |> 
      extract_covariates(env_vars)
  }))
    
  dat_rsf <- dat_rsf |> mutate(est = map(fits, ~ {
    m1 <- glm(case_ ~ dtw + imp + hab, family = binomial(), data = .x)
    
    tidy(m1, conf.int = TRUE) |>
      filter(term != "(Intercept)") |>
      dplyr::select(term, estimate, low = conf.low, high = conf.high) |>
      mutate(method = "rsf")
  }))

  write_rds(dat_rsf |> dplyr::select(id, res, fits), paste0(dir_res, "/emp_rsf_fits.rds"))
  write_rds(dat_rsf |> dplyr::select(id, res, est), paste0(dir_res, "/emp_rsf_est.rds"))
}


## SSF
if (!file.exists(paste0(dir_res, "/emp_ssf_est.rds"))) {
  dat_ssf <- dat |> mutate(fits = map(data, ~ {
    x <- .x |> 
      make_track(x, y, t) |>
      steps() |> 
      random_steps(n_control = 20) |> 
      extract_covariates(env_vars)
  }))
  
  dat_ssf <- dat_ssf |> mutate(est = map(fits, ~ {
    m1 <- fit_clogit(.x, case_ ~ dtw + imp + hab + sl_ + log(sl_) + cos(ta_) + strata(step_id_))
    
    tidy(m1$model, conf.int = TRUE) |>
      dplyr::select(term, estimate, low = conf.low, high = conf.high) |>
      mutate(method = "ssf")
  }))

  write_rds(dat_ssf |> dplyr::select(id, res, fits), paste0(dir_res, "/emp_ssf_fits.rds"))
  write_rds(dat_ssf |> dplyr::select(id, res, est), paste0(dir_res, "/emp_ssf_est.rds"))
}

# wRSF
if (!file.exists(paste0(dir_res, "/wrsf/inst_", nrow(dat), ".rds"))) {
  dat_wrsf <- dat |> mutate(
    ctmm = mclapply(data, function(x) {
      t1 <- x |> 
        make_track(x, y, t, crs = 3035) |> 
        amt::as_telemetry()
      
      SVF <- variogram(t1)
      GUESS <- ctmm.guess(t1, variogram = SVF, interactive = FALSE)
  
      # Select the best model
      FIT <- ctmm.select(t1, GUESS, trace = 0)
      FIT
    }, mc.cores = 5))
  
  dat_wrsf <- dat_wrsf |> mutate(telemetry = map(data, ~ {
    .x |> 
      make_track(x, y, t, crs = 3035) |> 
      amt::as_telemetry()
  }))
  dat_wrsf <- dat_wrsf |> 
    mutate(akde = map2(ctmm, telemetry, ~ akde(.y, .x, weights = TRUE)))
  
  write_rds(dat_wrsf, paste0(dir_res, "/emp_wrsf_fits.rds"))

  r.list <- as.list(env_vars)
  r.list <- lapply(r.list, raster)
  names(r.list) <- c("dist_water", "imperviousness", "habitat")
  
  for (i in 1:nrow(dat_wrsf)) {
    # print(i)
    wRSF <- ctmm::rsf.fit(dat_wrsf$telemetry[[i]], UD = dat_wrsf$akde[[i]], R = r.list, error = 0.1)
    r_wrsf <- summary(wRSF)$CI[1:length(r.list), , drop = FALSE]
    r_wrsf <- r_wrsf |> as_tibble() |> mutate(term = rownames(r_wrsf)) |>
      dplyr::select(term, estimate = est, low, high) |>
      mutate(term = map_chr(strsplit(term, " "), 1), method = "wrsf")
    
    dir.create(paste0(dir_res, "/emp_wrsf_est"))
    write_rds(r_wrsf, paste0(dir_res, "/emp_wrsf_est/inst_", i, ".rds"))
  }
}


Session Info
devtools::session_info()
─ Session info ───────────────────────────────────────────────────────────────
 setting  value
 version  R version 4.4.2 (2024-10-31)
 os       macOS Sequoia 15.4.1
 system   aarch64, darwin20
 ui       X11
 language (EN)
 collate  en_US.UTF-8
 ctype    en_US.UTF-8
 tz       Europe/Berlin
 date     2025-05-07
 pandoc   3.2 @ /Applications/RStudio.app/Contents/Resources/app/quarto/bin/tools/aarch64/ (via rmarkdown)

─ Packages ───────────────────────────────────────────────────────────────────
 package     * version    date (UTC) lib source
 amt         * 0.3.0.0    2024-06-20 [1] Github (jmsigner/amt@9d6cdc0)
 backports     1.5.0      2024-05-23 [1] CRAN (R 4.4.0)
 broom       * 1.0.5      2023-06-09 [1] CRAN (R 4.4.0)
 cachem        1.0.8      2023-05-01 [1] CRAN (R 4.4.0)
 checkmate     2.3.1      2023-12-04 [1] CRAN (R 4.4.0)
 class         7.3-22     2023-05-03 [1] CRAN (R 4.4.2)
 classInt      0.4-10     2023-09-05 [1] CRAN (R 4.4.0)
 cli           3.6.3      2024-06-21 [1] CRAN (R 4.4.0)
 codetools     0.2-20     2024-03-31 [1] CRAN (R 4.4.2)
 ctmm        * 1.2.0      2023-09-23 [1] CRAN (R 4.4.0)
 DBI           1.2.3      2024-06-02 [1] CRAN (R 4.4.0)
 DEoptimR      1.1-3      2023-10-07 [1] CRAN (R 4.4.0)
 devtools      2.4.5      2022-10-11 [1] CRAN (R 4.4.0)
 digest        0.6.35     2024-03-11 [1] CRAN (R 4.4.0)
 dplyr       * 1.1.4      2023-11-17 [1] CRAN (R 4.4.0)
 e1071         1.7-14     2023-12-06 [1] CRAN (R 4.4.0)
 ellipsis      0.3.2      2021-04-29 [1] CRAN (R 4.4.0)
 evaluate      0.23       2023-11-01 [1] CRAN (R 4.4.0)
 expm          0.999-9    2024-01-11 [1] CRAN (R 4.4.0)
 fansi         1.0.6      2023-12-08 [1] CRAN (R 4.4.0)
 fastmap       1.1.1      2023-02-24 [1] CRAN (R 4.4.0)
 forcats     * 1.0.0      2023-01-29 [1] CRAN (R 4.4.0)
 fs            1.6.4      2024-04-25 [1] CRAN (R 4.4.0)
 generics      0.1.3      2022-07-05 [1] CRAN (R 4.4.0)
 geosphere   * 1.5-18     2022-11-15 [1] CRAN (R 4.4.0)
 glue        * 1.8.0      2024-09-30 [1] CRAN (R 4.4.1)
 Gmedian       1.2.7      2022-06-08 [1] CRAN (R 4.4.0)
 here        * 1.0.1      2020-12-13 [1] CRAN (R 4.4.0)
 hms           1.1.3      2023-03-21 [1] CRAN (R 4.4.0)
 htmltools     0.5.8.1    2024-04-04 [1] CRAN (R 4.4.0)
 htmlwidgets   1.6.4      2023-12-06 [1] CRAN (R 4.4.0)
 httpuv        1.6.15     2024-03-26 [1] CRAN (R 4.4.0)
 httr          1.4.7      2023-08-15 [1] CRAN (R 4.4.0)
 jsonlite      1.8.8      2023-12-04 [1] CRAN (R 4.4.0)
 KernSmooth    2.23-24    2024-05-17 [1] CRAN (R 4.4.2)
 knitr         1.46       2024-04-06 [1] CRAN (R 4.4.0)
 later         1.3.2      2023-12-06 [1] CRAN (R 4.4.0)
 lattice       0.22-6     2024-03-20 [1] CRAN (R 4.4.2)
 lifecycle     1.0.4      2023-11-07 [1] CRAN (R 4.4.0)
 lubridate   * 1.9.3      2023-09-27 [1] CRAN (R 4.4.0)
 magrittr      2.0.3      2022-03-30 [1] CRAN (R 4.4.0)
 Matrix        1.7-1      2024-10-18 [1] CRAN (R 4.4.2)
 memoise       2.0.1      2021-11-26 [1] CRAN (R 4.4.0)
 mime          0.12       2021-09-28 [1] CRAN (R 4.4.0)
 miniUI        0.1.1.1    2018-05-18 [1] CRAN (R 4.4.0)
 move        * 4.2.4      2023-07-06 [1] CRAN (R 4.4.0)
 numDeriv      2016.8-1.1 2019-06-06 [1] CRAN (R 4.4.0)
 pillar        1.9.0      2023-03-22 [1] CRAN (R 4.4.0)
 pkgbuild      1.4.4      2024-03-17 [1] CRAN (R 4.4.0)
 pkgconfig     2.0.3      2019-09-22 [1] CRAN (R 4.4.0)
 pkgload       1.3.4      2024-01-16 [1] CRAN (R 4.4.0)
 profvis       0.3.8      2023-05-02 [1] CRAN (R 4.4.0)
 promises      1.3.0      2024-04-05 [1] CRAN (R 4.4.0)
 proxy         0.4-27     2022-06-09 [1] CRAN (R 4.4.0)
 purrr       * 1.0.2      2023-08-10 [1] CRAN (R 4.4.0)
 R6            2.5.1      2021-08-19 [1] CRAN (R 4.4.0)
 ragg          1.3.2      2024-05-15 [1] CRAN (R 4.4.0)
 raster      * 3.6-26     2023-10-14 [1] CRAN (R 4.4.0)
 rbibutils     2.2.16     2023-10-25 [1] CRAN (R 4.4.0)
 Rcpp          1.0.12     2024-01-09 [1] CRAN (R 4.4.0)
 Rdpack        2.6        2023-11-08 [1] CRAN (R 4.4.0)
 readr       * 2.1.5      2024-01-10 [1] CRAN (R 4.4.0)
 remotes       2.5.0      2024-03-17 [1] CRAN (R 4.4.0)
 rlang         1.1.4      2024-06-04 [1] CRAN (R 4.4.0)
 rmarkdown     2.26       2024-03-05 [1] CRAN (R 4.4.0)
 robustbase    0.99-2     2024-01-27 [1] CRAN (R 4.4.0)
 rprojroot     2.0.4      2023-11-05 [1] CRAN (R 4.4.0)
 RSpectra      0.16-1     2022-04-24 [1] CRAN (R 4.4.0)
 rstudioapi    0.16.0     2024-03-24 [1] CRAN (R 4.4.0)
 sessioninfo   1.2.2      2021-12-06 [1] CRAN (R 4.4.0)
 sf            1.0-16     2024-03-24 [1] CRAN (R 4.4.0)
 shiny         1.8.1.1    2024-04-02 [1] CRAN (R 4.4.0)
 sp          * 2.1-4      2024-04-30 [1] CRAN (R 4.4.0)
 stringi       1.8.4      2024-05-06 [1] CRAN (R 4.4.0)
 stringr       1.5.1      2023-11-14 [1] CRAN (R 4.4.0)
 survival      3.7-0      2024-06-05 [1] CRAN (R 4.4.2)
 systemfonts   1.1.0      2024-05-15 [1] CRAN (R 4.4.0)
 terra         1.7-78     2024-05-22 [1] CRAN (R 4.4.0)
 textshaping   0.4.0      2024-05-24 [1] CRAN (R 4.4.0)
 tibble        3.2.1      2023-03-20 [1] CRAN (R 4.4.0)
 tidyr       * 1.3.1      2024-01-24 [1] CRAN (R 4.4.0)
 tidyselect    1.2.1      2024-03-11 [1] CRAN (R 4.4.0)
 timechange    0.3.0      2024-01-18 [1] CRAN (R 4.4.0)
 tzdb          0.4.0      2023-05-12 [1] CRAN (R 4.4.0)
 units         0.8-5      2023-11-28 [1] CRAN (R 4.4.0)
 urlchecker    1.0.1      2021-11-30 [1] CRAN (R 4.4.0)
 usethis       2.2.3      2024-02-19 [1] CRAN (R 4.4.0)
 utf8          1.2.4      2023-10-22 [1] CRAN (R 4.4.0)
 vctrs         0.6.5      2023-12-01 [1] CRAN (R 4.4.0)
 withr         3.0.0      2024-01-16 [1] CRAN (R 4.4.0)
 xfun          0.49       2024-10-31 [1] CRAN (R 4.4.1)
 xml2          1.3.6      2023-12-04 [1] CRAN (R 4.4.0)
 xtable        1.8-4      2019-04-21 [1] CRAN (R 4.4.0)
 yaml          2.3.8      2023-12-11 [1] CRAN (R 4.4.0)

 [1] /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/library

──────────────────────────────────────────────────────────────────────────────